package response

import (
	"github.com/gogf/gf/errors/gerror"
	"github.com/gogf/gf/net/ghttp"
)

// JsonResponse 以json数据的形式的响应体类型
type JsonResponse struct {
	Code   int         `json:"code"`   // 状态码, 默认200为请求成功, 500为请求错误
	Errmsg string      `json:"errmsg"` // 错误的时候的错误信息
	Data   interface{} `json:"data"`   // 请求成功后返回的数据
}

// writeJsonExit 相当于是重写了ghttp.Response#WriteJsonExit方法
func writeJsonExit(r *ghttp.Request, data interface{}) {
	// 写出Json数据, 注意不要调用Exit()方法, 还需要做其它的操作
	_ = r.Response.WriteJson(data)
	// 重写Content-Type, 指定字符集为utf-8
	r.Response.Header().Set("Content-Type", "application/json;charset=utf-8")
	// 调用Exit()方法退出
	r.Exit()
}

// Success 成功响应, 响应完成后会直接退出请求, 即默认执行Exit()
func Success(r *ghttp.Request, data interface{}) {
	// 传递指针, 减少数据拷贝开销
	writeJsonExit(r, &JsonResponse{
		Code: 200,
		Data: data,
	})
}

// Error 错误响应, 响应完成后会直接退出请求, 即默认执行Exit()
func Error(r *ghttp.Request, err error) {
	// 传递指针, 减少数据拷贝开销
	ErrorS(r, 500, err)
}

// ErrorS 普通的错误响应, 可以使用自定义错误吗, 响应完成后会直接退出请求, 即默认执行Exit()
func ErrorS(r *ghttp.Request, code int, err error) {
	// 传递指针, 减少数据拷贝开销
	writeJsonExit(r, &JsonResponse{
		Code:   code,
		Errmsg: gerror.Current(err).Error(), // 转为gf提供的Error类型
	})
}
